﻿using System;

namespace Jellyfish.Virtu
{
	// ReSharper disable once UnusedMember.Global
	public partial class Cpu
	{
		public void Sync(IComponentSerializer ser)
		{
			ser.Sync(nameof(_is65C02), ref _is65C02);
			ser.Sync(nameof(_multiplier), ref _multiplier);

			ser.Sync(nameof(_ra), ref _ra);
			ser.Sync(nameof(_rx), ref _rx);
			ser.Sync(nameof(_ry), ref _ry);
			ser.Sync(nameof(_rs), ref _rs);
			ser.Sync(nameof(_rp), ref _rp);
			ser.Sync(nameof(_rpc), ref _rpc);
			ser.Sync(nameof(_ea), ref _ea);
			ser.Sync(nameof(_cc), ref _cc);
			ser.Sync(nameof(_opCode), ref _opCode);
			ser.Sync(nameof(_cycles), ref _cycles);

			if (!ser.IsReader)
			{
				// A way to set the action callback
				Is65C02 = _is65C02;
			}
		}

		private Action[] _executeOpCode65N02;
		private Action[] _executeOpCode65C02;
		private Action[] _executeOpCode;

		private bool _is65C02;
		private int _multiplier;

		private int _ra;
		private int _rx;
		private int _ry;
		private int _rs;
		private int _rp;
		private int _rpc;
		private int _ea;
		private int _cc;
		private int _opCode;
		private long _cycles;

		private const int Pc = 0x01;
		private const int Pz = 0x02;
		private const int Pi = 0x04;
		private const int Pd = 0x08;
		private const int Pb = 0x10;
		private const int Pv = 0x40;
		private const int Pn = 0x80;

		private static readonly int[] DataPn =
		{
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn
		};

		private static readonly int[] DataPz =
		{
			Pz,  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
		};

		private static readonly int[] DataPnz =
		{
			Pz,  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,
			Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn,  Pn
		};
	}
}
